package com.situ.mall.controller.front;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.situ.mall.common.ServerResponse;
import com.situ.mall.constant.MallConstant;
import com.situ.mall.entity.Cart;
import com.situ.mall.entity.Product;
import com.situ.mall.entity.User;
import com.situ.mall.service.ICartService;
import com.situ.mall.service.IProductService;
import com.situ.mall.service.IUserService;
import com.situ.mall.util.CartUtil;
import com.situ.mall.vo.CartItemVO;
import com.situ.mall.vo.CartVO;

@Controller
@RequestMapping(value="/cart")
public class FrontCartController {
	@Autowired
	private IProductService productService;
	@Autowired
	private ICartService cartService;
	
	
	
	//将购物车信息从cookie拿出修改，再存入到cookie中(类似数据库，下面3个就是写了三个方法)
	//num页面显示的数量
	
	@RequestMapping(value="/addOrUpdateCart.shtml")
	@ResponseBody
	public ServerResponse addOrUpdateCart(Integer productId,Integer amount,Integer isChecked,HttpServletRequest request,HttpServletResponse response,HttpSession session) {
		User user = (User) session.getAttribute("user");
		if (user != null) { //已登陆
			/*System.out.println(amount);
			System.out.println(isChecked);
			System.out.println(productId);
			System.out.println("JJJJJ");*/
			//添加到购物车，如果购物车有 ，数量加1，没有添加新的
			
			boolean isExist = false;
			List<Cart> carts = cartService.selectByUserId(user.getId());
			for (Cart cart : carts) {
				if (cart.getProductId().intValue() == productId.intValue()) {//如果购物车内的商品存在
					isExist = true;
					cart.setProductId(productId);
					if (amount != null) { //amount不为空，即点击+、—号不为空
						int newAmount = cart.getQuantity() + amount;
						if (newAmount >= 0) {
							cart.setQuantity(newAmount);
						}
					}
					cart.setChecked(isChecked);
					cartService.update(cart); //商品存在执行更新，不存在执行添加
				}
			}
			
			// 2、productId对应的商品不在CartVO里面的话，添加这个CartItemVO到CartVO
			// 在原来CartVO购物车里面没有找到这个商品，直接添加这个商品
			if (isExist == false) {
				Cart cart = new Cart();
				cart.setUserId(user.getId());
				cart.setProductId(productId);
				cart.setQuantity(amount);
				cart.setChecked(isChecked);
				cartService.insert(cart);
			}
			return ServerResponse.createSuccess("成功");
			
		} else { //未登录
			//a、将cookie中购物车对象转换为CartVO对象(类似数据库取出放入一个对象) 
			CartVO cartVO = CartUtil.getCartVOFromCookie(request);
			if (cartVO == null) {
				cartVO = new CartVO();
			}
			
			//b、往cartVO添加购物项
			boolean result = addOrUpdateCart(cartVO,productId,amount,isChecked);
			if (result == false) {
				return ServerResponse.createError("购物车添加失败");
			}
			
			//c、将CartVO对象设置到cookie(类似修改完再放回去)
			CartUtil.setCartVOToCookie(cartVO,response);
			return ServerResponse.createSuccess("购物车添加成功");	
		}
		
		
	}
	

	
	//跳转购物车页面
	@RequestMapping(value="/getCartPage.shtml")
	public String getCartPage(HttpServletRequest request,Model model,HttpSession session) {
		//如果未登陆user="",就用cookie的方式展现。如果登陆了cookie就没了，就从数据库查
		User user = (User) session.getAttribute("user");
		if (user != null) { //登陆了从数据库展示
			
			List<Cart> carts = cartService.selectByUserId(user.getId());
			
			List<CartItemVO> cartItemVOList = new ArrayList<>();
			for (Cart cart : carts) {
				Product product = productService.selectByPrimaryKey(cart.getProductId());
				CartItemVO cartItemVO = new CartItemVO();
				cartItemVO.setProduct(product);
				cartItemVO.setAmount(cart.getQuantity());
				cartItemVO.setIsChecked(cart.getChecked());
				cartItemVOList.add(cartItemVO);
			}
			CartVO cartVO = new CartVO();
			cartVO.setCartItemVOList(cartItemVOList);
			
			model.addAttribute("cartVO",cartVO);
		} else {  //未登录使用cookie展示
			
			//将Cookie对象转换成CartVO对象在界面展示
			CartVO cartVO = CartUtil.getCartVOFromCookie(request);
			if(cartVO != null){
				List<CartItemVO> cartItemVOList = cartVO.getCartItemVOList();
				// CartItemVO里面的Product只有id，我们要在购物车页面展示商品的详细信息，
				// 所以要根据这个id查找出产品的详细信息，直接把原来的Product替换
				for (CartItemVO cartItemVO : cartItemVOList) {
					Product product = productService.selectByPrimaryKey(cartItemVO.getProduct().getId());
					cartItemVO.setProduct(product);
					System.out.println(product);
					System.out.println(cartItemVO);
				}
				model.addAttribute("cartVO",cartVO);
			}
		}
		return "cart/cart";
	}
	
	//删除购物车的某一个选项
	@RequestMapping(value="/deleteById.shtml")
	@ResponseBody
	public ServerResponse delete(Integer productId,HttpServletRequest request,HttpServletResponse response,HttpSession session) {
		User user = (User) session.getAttribute("user");
		if (user != null) { //登陆状态下删除购物车
			return cartService.deleteByProductId(productId);
			
		} else { //非登陆状态删除购物车
			//1、将cookie中购物车对象转换为CartVO对象(类似数据库取出放入一个对象) 
			CartVO cartVO = CartUtil.getCartVOFromCookie(request);
			if (cartVO == null) {
				return ServerResponse.createSuccess("获取购物车信息失败");
			}
			//2、删除cookie的指定的信息
			List<CartItemVO> cartItemVOList = cartVO.getCartItemVOList();
			//以往的for循环内删除信息会报错，所以必须用Iterator
			Iterator<CartItemVO> iterator = cartItemVOList.iterator();
			while (iterator.hasNext()) {
				CartItemVO cartItemVO = (CartItemVO) iterator.next();
				if (cartItemVO.getProduct().getId().intValue() == productId.intValue()) {
					iterator.remove();
				}
			}
			
			//3、放入cookie
			CartUtil.setCartVOToCookie(cartVO, response);
			return ServerResponse.createSuccess("删除成功");
		}
	}
	
	
	/**
	 * b、第二个方法往cart添加购物项
	 * 库存不够，商品下架等异常在这判断
	 *如果写详细的弹出页面信息，把这段移上去，上面直接return ServerResponse.creatSucess("XXXX");
	 * @param cartVO
	 * @param productId
	 * @param amount
	 * @param isChecked
	 * @return
	 */
	private  boolean addOrUpdateCart(CartVO cartVO, Integer productId, Integer amount, Integer isChecked) {
		System.out.println(isChecked);
		boolean isExist = false;
		List<CartItemVO> cartItemVOList = cartVO.getCartItemVOList();
		Product product = productService.selectByPrimaryKey(productId);
		for (CartItemVO cartItemVO : cartItemVOList) {
			//productId的对应商品如果在的话，就直接将数量更新
			if (cartItemVO.getProduct().getId().intValue() == productId.intValue()) {
				isExist = true;
				if (amount != null) {
					int newAmount = cartItemVO.getAmount() + amount;
					if (newAmount > product.getStock() || newAmount < 0) {
						// 超出库存，返回false，添加购物车失败
						return false;
					}
					cartItemVO.setAmount(newAmount);
					}
				if (isChecked != null) {
					// 将是否选中的状态修改为前台传过来的状态
					cartItemVO.setIsChecked(isChecked);
				}
			}
				// 判断商品有没有超过库存
		}
		
		// 2、productId对应的商品不在CartVO里面的话，添加这个CartItemVO到CartVO
		// 在原来CartVO购物车里面没有找到这个商品，直接添加这个商品
		if (isExist == false) {
			CartItemVO cartItemVO = new CartItemVO();
			Product prod = new Product();
			prod.setId(productId);
			cartItemVO.setProduct(prod);
			cartItemVO.setAmount(amount);
			cartItemVO.setIsChecked(MallConstant.CART_CHECKED);
			
			cartItemVOList.add(cartItemVO);
		}
		return true;
	}
}
